package com.cy.dbsys.service.impl;

import com.cy.commom.exception.ServiceException;
import com.cy.commom.pojo.CheckBox;
import com.cy.commom.pojo.PageObject;
import com.cy.dbsys.dao.SysRoleDao;
import com.cy.dbsys.dao.SysRoleMenuDao;
import com.cy.dbsys.dao.SysUserRoleDao;
import com.cy.dbsys.pojo.SysRole;
import com.cy.dbsys.pojo.SysRoleMenu;
import com.cy.dbsys.service.SysRoleService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.List;

@Service
public class SysRoleServiceImpl implements SysRoleService {
    @Autowired
    private SysRoleDao sysRoleDao;
    @Autowired
    private SysRoleMenuDao sysRoleMenuDao;
    @Autowired
    private SysUserRoleDao sysUserRoleDao;
    /**(用户添加模块)查询角色id,name*/
    @Override
    public List<CheckBox> findObjects() {
        return sysRoleDao.findObjects();
    }

    /**(修改模块)1、基于id查询角色数据*/
    @RequiresPermissions("sys:role:update")
    @Override
    public SysRoleMenu findById(Integer id) {
        //1、参数校验
        if(id==null||id<0)
            throw new IllegalArgumentException("请选择需要修改的数据");

    /*  //方案一、在业务层查询俩次
        //2、查询角色自身信息
        SysRoleMenu roleMenu = sysRoleDao.findObjectById(id);
        //3、查询角色对应的菜单id
        List<Integer> menuIds = sysRoleMenuDao.findMenuIdsByRoleId(id);
        //4、把菜单id封装到SysRoleMenu对象中并返回
        roleMenu.setMenuIds(menuIds);
    */
        //方案二、在业务层查询一次
        SysRoleMenu roleMenu=sysRoleDao.findObjectById(id);
        return roleMenu;

    }
    /**(修改模块)2、基于id修改自身信息*/

    @Transactional
    @Override
    public int updateObject(SysRole entity, Integer[] menuIds) {
        //1、校验数据
        if(entity==null)
            throw new IllegalArgumentException("更新的对象不能为空");
        if(entity.getId()==null)
            throw new IllegalArgumentException("id值不能为空");
        if(StringUtils.isEmpty(entity.getName()))
            throw new IllegalArgumentException("角色名不能为空");
        if(menuIds==null||menuIds.length==0)
            throw new IllegalArgumentException("必须为角色指定一个权限");
        //2、更新自身信息
        int row = sysRoleDao.updateObject(entity);
        //3、删除角色菜单关系表中对应的数据
        sysRoleMenuDao.deleteObjectsByRoleId(entity.getId());
        //4、新增角色菜单关系数据
        sysRoleMenuDao.insertObjects(entity.getId(),menuIds);
        //5、返回结果
        return row;
    }

    /**(添加模块)添加自身数据*/
    @RequiresPermissions("sys:role:add")
    @Transactional//添加此注解表示执行此方法时会开启事务，
    @Override
    public int saveObject(SysRole entity, Integer[] menuIds) {
        //1.参数有效性校验
        if(entity==null)
            throw new IllegalArgumentException("保存对象不能为空");
        if(StringUtils.isEmpty(entity.getName()))
            throw new IllegalArgumentException("角色名不允许为空");
        if(menuIds==null||menuIds.length==0)
            throw new ServiceException("必须为角色分配权限");
        //2.保存角色自身信息
        int rows=sysRoleDao.insertObject(entity);
        //3.保存角色菜单关系数据
        sysRoleMenuDao.insertObjects(entity.getId(), menuIds);
        //4.返回业务结果
        return rows;

    }

    /**(删除模块)根据id删除角色信息*/
    @RequiresPermissions("sys:role:delete")
    @Transactional
    @Override
    public int deleteObject(Integer id) {
        //1、验证数据的合法性
        if(id==null||id<0)
            throw new IllegalArgumentException("请选择需要删除的信息");
        //2、基于id删除关系数据
        sysRoleMenuDao.deleteObjectsByRoleId(id);
        sysUserRoleDao.deleteObjectByRoleId(id);
        //3、删除自身信息
        int rows = sysRoleDao.deleteObject(id);
        if(rows==0)
            throw new ServiceException("此记录可能已经不存在");
        return rows;
    }

    /**(查询模块)查询记录*/
    @Override
    public PageObject<SysRole> findPageObjects(String name, Integer pageCurrent) {
        //1、参数校验
        if(pageCurrent==null ||pageCurrent<1)
            throw new IllegalArgumentException("当前页码值无效");//参数不合法错误
        //2、查询总记录数
        int rowCount =sysRoleDao.getRowCount(name);
        if(rowCount==0)
            throw new IllegalArgumentException("没找到对应记录");
        //3、查询当前页数据/
        int pageSize =5;
        int startIndex=(pageCurrent-1)*pageSize;
        List<SysRole> records =sysRoleDao.findPageObjects(name,startIndex,pageSize);
        //4、对查询结果进行分装并返回
        return new PageObject<>(records,rowCount,pageSize,pageCurrent);
    }
}
